package cn.sprouting.tool;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.util.RandomUtil;
import cn.sprouting.model.Area;
import cn.sprouting.model.University;
import cn.sprouting.model.common.Constant;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author ：LX
 * @ Date 创建时间： 2021/10/27. 0:23
 * 地点：长沙麓谷
 * 目的: 随机学校
 * 备注说明：
 */
public class RandomSchoolTool {

    /**
     * 常用数字
     */
    private static ArrayList<String> LIST_NUM = CollUtil.newArrayList("一", "二", "三", "四", "五", "六");


    /**
     * 生成小学名称
     * @return
     */
    public static String getPrimarySchoolName(){
        List<String> list = getPrimarySchoolName(1, null, null, null);
        if (list == null || list.size() == 0){
            return null;
        }
        return list.get(0);
    }

    /**
     * 生成小学名称
     * @param num 生成数量
     * @return
     */
    public static List<String> getPrimarySchoolName(Integer num){
        return getPrimarySchoolName(num, null, null, null);
    }

    /**
     * 生成小学名称
     * @param num 生成数量
     * @param provinceCodeList 是否指定生成指定省的地区信息，注意，省市代码长度，可以为null
     * @param cityCodeList 是否指定生成指定市区的地区信息，注意，省市代码长度，可以为null
     * @param countyCodeList 是否指定生成指定县的地区信息，注意，省市代码长度，可以为null
     * @return
     */
    public static List<String> getPrimarySchoolName(Integer num, List<String> provinceCodeList, List<String> cityCodeList, List<String> countyCodeList){
        if (num == null || num < 1){
            num = 1;
        }
        List<Area> areaList = RandomAreaTool.getArea(num, provinceCodeList, cityCodeList, countyCodeList);
        if (areaList == null || areaList.size() == 0){
            return null;
        }

        List<String> countyList = areaList.stream().map(Area::getCounty).collect(Collectors.toList());
        List<String> saveList = new ArrayList<>();
        for (String county : countyList){
            saveList.add(county + "第" + RandomUtil.randomEle(LIST_NUM) + "小学");
        }
        return saveList;
    }

    /**
     * 随机生成小学年级
     * @return
     */
    public static String getPrimarySchoolGrade(){
        return RandomUtil.randomEle(LIST_NUM) + "年级";
    }

    /**
     * 生成中学名称
     * @return
     */
    public static String getMiddleSchoolName(){
        List<String> list = getMiddleSchoolName(1, null, null, null);
        if (list == null || list.size() == 0){
            return null;
        }
        return list.get(0);
    }

    /**
     * 生成中学名称
     * @param num 生成数量
     * @return
     */
    public static List<String> getMiddleSchoolName(Integer num){
        return getMiddleSchoolName(num, null, null, null);
    }

    /**
     * 生成中学名称
     * @param num 生成数量
     * @param provinceCodeList 是否指定生成指定省的地区信息，注意，省市代码长度，可以为null
     * @param cityCodeList 是否指定生成指定市区的地区信息，注意，省市代码长度，可以为null
     * @param countyCodeList 是否指定生成指定县的地区信息，注意，省市代码长度，可以为null
     * @return
     */
    public static List<String> getMiddleSchoolName(Integer num, List<String> provinceCodeList, List<String> cityCodeList, List<String> countyCodeList){
        if (num == null || num < 1){
            num = 1;
        }
        List<Area> areaList = RandomAreaTool.getArea(num, provinceCodeList, cityCodeList, countyCodeList);
        if (areaList == null || areaList.size() == 0){
            return null;
        }

        List<String> countyList = areaList.stream().map(Area::getCounty).collect(Collectors.toList());
        List<String> saveList = new ArrayList<>();
        for (String county : countyList){
            saveList.add(county + "第" + RandomUtil.randomEle(LIST_NUM) + "中学");
        }
        return saveList;
    }

    /**
     * 成人高等学校，该名单根据2019年教育部名单生成
     */
    public static University getAdultCollegesAndUniversities(){
        return getAdultCollegesAndUniversities(1).get(0);
    }

    /**
     * 成人高等学校，该名单根据2019年教育部名单生成
     * @param num 生成数量，数量应该适中，该数据的范围是有限的,如果超出范围，只会返回最大数量
     */
    public static List<University> getAdultCollegesAndUniversities(Integer num){
        String adultCollegesAndUniversities = ResourceUtil.readUtf8Str("adultCollegesAndUniversities.txt");
        String[] array = adultCollegesAndUniversities.split("\r\n");

        List<University> list = new ArrayList<>();
        for (String str : array){
            ArrayList<String> row = CollUtil.newArrayList(str.split(","));

            boolean civilianRunBoolean = Constant.YesNoBoolean.NO;
            if (row.size() > 6){
                String civilianRun = row.get(6);
                if ("民办".equals(civilianRun)){
                    civilianRunBoolean = Constant.YesNoBoolean.YES;
                }
            }

            University university = new University(row.get(1), row.get(2), row.get(3), row.get(0), null, null, civilianRunBoolean);
            list.add(university);
        }

        if (num == null || num < 1){
            num = 1;
        }
        if (num > list.size()){
            num = list.size();
        }

        return RandomUtil.randomEleList(list, num);
    }

    /**
     * 随机获取普通高等学校，该学校名单根据2019年教育部名单生成
     * @return
     */
    public static University getCollegesAndUniversities(){
        return getCollegesAndUniversities(1).get(0);
    }

    /**
     * 随机获取普通高等学校，该学校名单根据2019年教育部名单生成
     * @param num 生成数量，数量应该适中，该数据的范围是有限的,如果超出范围，只会返回最大数量
     * @return
     */
    public static List<University> getCollegesAndUniversities(Integer num){
        // 获取普通高等学校
        String collegesAndUniversities = ResourceUtil.readUtf8Str("collegesAndUniversities.txt");
        String[] array = collegesAndUniversities.split("\r\n");

        List<University> list = new ArrayList<>();
        for (String str : array){
            ArrayList<String> row = CollUtil.newArrayList(str.split(","));

            boolean civilianRunBoolean = Constant.YesNoBoolean.NO;
            if (row.size() > 6){
                String civilianRun = row.get(6);
                if ("民办".equals(civilianRun)){
                    civilianRunBoolean = Constant.YesNoBoolean.YES;
                }
            }

            University university = new University(row.get(1), row.get(2), row.get(3), row.get(0), row.get(4), row.get(5), civilianRunBoolean);
            list.add(university);
        }

        if (num == null || num < 1){
            num = 1;
        }
        if (num > list.size()){
            num = list.size();
        }

        return RandomUtil.randomEleList(list, num);
    }

    /**
     * 随机生成班级名称
     * @return
     */
    public static String getClassName(){
        return getClassName(1).get(0);
    }

    /**
     * 随机生成班级名称
     * @param num 生成数量
     * @return
     */
    public static List<String> getClassName(Integer num){
        if (num == null || num < 1){
            num = 1;
        }
        List<String> saveList = new ArrayList<>();
        for (int i = 0; i < num; i ++){
            saveList.add(RandomUtil.randomInt(100, 240) + "班");
        }

        return saveList;
    }


}
